package com.lcredu.lcredu;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author kirito
 * @create 2023-09-18 15:29
 */
public class lcrliving {
    public static void main(String[] args) {
        //创建person对象
        Person person1 = new Person(1, "a", 22);
        Person person2 = new Person(2, "b", 34);
        Person person3 = new Person(3, "c", 10);
        Person person4 = new Person(4, "d", 110);
        Person person5 = new Person(5, "e", 9);

        //放入到集合
        List<Person> list = Arrays.asList(person1, person2, person3, person4, person5);
        System.out.println("list=>" + list);

        //2.1 对entities进行过滤,返回一级分类
        //2.2 进行map映射操作，给每个分类设置对应的子分类(这个过程会使用到递归)
        //2.3 进行排序sorted操作
        //2.4 将处理好的数据进行一个收集collect到集合中

        //需求:从list中过滤出 person.id % 2 != 0的对象
        /**
         * 1. list.stream():把list转为流对象,目的是为了使用流的方法=>这样就可以处理一些复杂的业务！
         * 2. filter()传入的是Predicate,返回的是boolean
         * 3. collect() 传入 Collector, 将数据收集到集合
         * 4. map操作: 希望给过滤出来得到的person对象加入到cat
         * 5. sorted操作: 传入一个Comparator,也就是一个比较器
         */
//        List<Person> list2 = list.stream().filter(person -> {
//            return person.getId() % 2 != 0;
//        }).map(person -> {//map操作: 希望给过滤出来得到的person对象加入到cat,可以根据业务逻辑完成
//            //map操作会直接影响list中的对象
//            Cat cat = new Cat(person.getId() + 100, "小花猫", "花色");
//            person.setCat(cat);
//            return person;
//        }).sorted((p1, p2) -> {
//            //return p1.getId() - p2.getId();//默认按照id升序排列
//            return p2.getId() - p1.getId();//默认按照id降序排列
//            //按照年龄从大到小
//            //return p2.getAge() - p2.getAge();
//        }).collect(Collectors.toList());
//
//        System.out.println("list2=>" + list2);
//        System.out.println("list=>" + list);//list不变化

        //还有几个常用的api方法
        //limit:
        //需求:要显示list集合的前两个数据
        list.stream().limit(2).forEach(person -> {
            System.out.println(person);
        });

        //count的使用
        long count = list.stream().count();
        System.out.println("count=" + count);

        //先过滤再count
        long count2 = list.stream().filter(person -> {
            return person.getId() > 3;
        }).count();
        System.out.println("count=" + count2);
    }
}

class Person {
    private Integer id;
    private String name;
    private Integer age;
    private Cat cat;

    public Person(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Cat getCat() {
        return cat;
    }

    public void setCat(Cat cat) {
        this.cat = cat;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", cat=" + cat +
                '}';
    }
}

class Cat {
    private Integer id;
    private String name;
    private String color;

    public Cat(Integer id, String name, String color) {
        this.id = id;
        this.name = name;
        this.color = color;
    }

    @Override
    public String toString() {
        return "Cat{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", color='" + color + '\'' +
                '}';
    }
}
